#coding=utf-8
__author__ = 'jy@cjlu.edu.cn'
"""
last updated by jy 2013-05-02
根据tornado的上传文件的方式改写了一下上传的方式，测试OK
"""
import time
from web.utils import storage
from config import TP_PATH


class ExcelOperator:
    """
    用于处理通过web.py上传上来的excel文件
    依赖xlrd包
    excel文件的格式要求前三行定义为：
    第一行：各字段的中文名称
    第二行：各字段的字段名(英文)
    第三行：各字段填写的要求
    第四行以后为数据
    上传后默认放在TP_PATH/static/tmpfiles目录，以时间重新命名
    解析后返回result中包含　
    fields,zfields,data,row_count,col_count
    多列信息分别代表字段名，中文名，数据（按字段名生成了storage）行数，列数
    """

    def uploadFile(self, i):
        """
        上传文件，输入参数是i，将问文件上传到指定的目录
        @param i: 页面参数
        @return:保存后的文件名
        """
        try:
            strBaseLocation = TP_PATH + "/static/tmpfiles"
            #需要在这里增加一个excel={}否则上传的文件名及大小等信息不会被保留
            if i.files:
                f = i.files['excel'][0]
                if str(f.filename[-4:]).lower() == ".xls":
                    nfilename = strBaseLocation + "/u_" + time.strftime("%Y%m%d%H%M%S") + ".xls"
                    fout = open(nfilename, 'wb')#excel需要使用二进制写入打开参数需要wb
                    fout.write(f['body'])
                    fout.close()
                    return nfilename
                else:
                    raise Exception, "filetype error,please give Excel2000 format file with extendname is xls"
        except:
            raise Exception, "Upload file error,please check filefield named excel."

    #解析指定格式的excel文件

    def parseExcel(self, excelfilename):
        """
        返回值中包括 英文属性名、中文属性名、数据、行数、列数
        """
        try:
            import xlrd
            #打开excel不保留格式信息
            bk = xlrd.open_workbook(excelfilename)
            #shxrange = range(bk.nsheets)
            try:
                sh = bk.sheet_by_name("Sheet1")
            except:
                raise Exception, "no sheet named Sheet1"
            nrows = sh.nrows
            ncols = sh.ncols
            result = []
            fields = []
            zfields = []
            for c in range(ncols):
                zfields.append(sh.cell_value(0, c))
            for c in range(ncols):
                fields.append(sh.cell_value(1, c))
            for i in range(3, nrows):
                #需要引入storage才好用
                row = storage()
                for c in range(ncols):
                    row[fields[c]] = sh.cell_value(i, c)
                result.append(row)
            data = storage
            data.fields = fields
            data.zfields = zfields
            data.data = result
            data.row_count = nrows - 3
            data.col_count = ncols
            return data
        except:
            raise Exception, "install xlrd first,pypm install xlrd"

    def openExistExcel(self, excelfilename):
        """
        返回一个可以写入数据工作簿
        """
        try:
            from xlrd import open_workbook
            from xlutils.copy import copy
            #打开EXCEL并保留格式信息
            rb = open_workbook(excelfilename, formatting_info=True)
            wb = copy(rb)
            ws = wb.get_sheet(0)
            return wb, ws
        except:
            print "pypm install xlrd;pypm install xlwt;pypm install xlutils.then try again"
            return None


if __name__ == "__main__":
    raise Exception, "哈哈错误了"
